

/**
 * 字段定义说明
 * userInfo.playerType定义：  0位房主，1为非房主玩家，2为观众
 */


/**
 * 监听事件定义
 * onCreateRoom
 * onJoinRoom
 * onStartGame
 * onDraw
 * onClearDraw
 * onChatMsg
 * 
 * 
 * 发送事件定义
 * createRoomSuccess
 * joinRoomSuccess
 * updatePlayers
 * onStartGameSuccess
 * onDraw
 * onClearDraw
 * onChatMsg
 */

const httpServer = require("http").createServer();
const io = require("socket.io")(httpServer, {
  cors: {
    origin: "*",
    methods: ["GET", "POST"]
  }
});

// 存储所有房间id
var roomIdList = []

// 客户端接入
io.on("connection", (socket) => {
  console.log("新接入客户端", socket.id)

  // 房间号
  let _roomId = ""

  let _userList = []

  // 客户端用户信息
  let _userInfo = {}

  /**
   * 创建房间事件
   */
  socket.on("onCreateRoom", (userInfo) => {
    console.log("[onCreateRoom]", userInfo)
    // TODO 按一定逻辑生成房间号
    let roomId = "1001"
    userInfo.playerType = 0
    _userInfo = userInfo
    _roomId = roomId;
    _userList.push(_userInfo)

    // 用户加入房间
    socket.join(roomId);

    // 发送创建成功消息，回调roomId、玩家列表，端侧进行跳转
    socket.to(socket.id).emit("createRoomSuccess", roomId, _userList)
  })

  /**
  * 加入房间事件
  */
  socket.on("onJoinRoom", (userInfo, roomId) => {
    console.log("[onJoinRoom]", userInfo, roomId)
    // TODO 默认为玩家（观众角色暂未实现）
    userInfo.playerType = 1
    _userInfo = userInfo
    _roomId = roomId;
    _userList.push(_userInfo)

    // 用户加入房间
    socket.join(roomId);
    // 发送加入成功消息，端侧进行跳转
    socket.to(socket.id).emit("joinRoomSuccess", _userList)
    // 给其他玩家广播消息（不包括自己）, 更新玩家列表
    socket.broadcast.to(roomid).emit('updatePlayers', _userList);
  })

  /**
  * 开始游戏事件
  */
  socket.on("onStartGame", () => {
    console.log("[onStartGame]", userInfo)
    // 仅房主可开始游戏
    if (_userInfo.playerType != 0) {
      console.log("[onStartGame] not roomOwner, return")
      return
    }
    // 通知房间内所有玩家开始游戏，端侧进行跳转
    socket.in(roomId).emit('onStartGameSuccess');//包括自己

    // TODO 设置画者、开始倒计时等
  })

  /**
  * 绘画事件
  */
  socket.on("onDraw", (drawInfo) => {
    console.log("[onDraw]", drawInfo)
    // 给其他玩家广播绘画事件（不包括自己）
    socket.broadcast.to(roomid).emit('onDraw', drawInfo);
  })

  /**
  * 清除画板事件
  */
  socket.on("onClearDraw", () => {
    console.log("[onClearDraw]")
    // 给其他玩家广播清除画板事件（不包括自己）
    socket.broadcast.to(roomid).emit('onClearDraw');
  })


  
  /**
  * 聊天事件
  */
   socket.on("onChatMsg", (msg) => {
    console.log("[onChatMsg]", msg)
    // TOOD 判断是否答对，计分等等

    // 给其他玩家广播聊天事件（不包括自己）
    socket.broadcast.to(roomid).emit('onChatMsg', _userInfo, msg);
  })

  // // 加入房间事件
  // socket.on('joinRoom', (roomId, userInfo) => {
  //   _roomId = roomId;
  //   let username = userInfo.username
  //   //用户加入房间
  //   socket.join(roomId);
  //   //对房间内的用户发送消息
  //   console.log("joinRoom=" + username)
  //   socket.in(roomId).emit('joinRoom', username + '加入了房间');//包括自己
  //   //socket.broadcast.to(roomid).emit('event_name', data);//不包括自己
  // });

  // // 绘画事件
  // socket.on('onTouchMove', (drawInfo) => {
  //   // console.log("收到消息：onTouchMove", drawInfo)
  //   // socket.broadcast.emit('onTouchMove', drawInfo)
  //   socket.in(_roomId).emit('onTouchMove', drawInfo)
  // });

  // // 清除绘画事件
  // socket.on('clearDraw', () => {
  //   console.log("clearDraw")
  //   // socket.broadcast.emit('clearDraw')
  //   socket.in(_roomId).emit('clearDraw')
  // });

  // // 聊天事件
  // socket.on('sendMsg', (msg) => {
  //   console.log("sendMsg=" + msg)
  //   // socket.broadcast.emit('sendMsg', msg)
  //   socket.in(_roomId).emit('sendMsg', msg)
  // });
});
httpServer.listen(3001);
console.log("run in port 3001")